<script>
    // call的原理
    ; (function () {
        function mlcall(context) {
            context = context ? Object(context) : window;
            // this就是fn  
            // this()  fn()
            context.f = this;
            let args = []; // 收集函数的参数
            for(var i=1; i<arguments.length; i++){
                args.push(arguments[i]);
            }
            let res = context.f(...args)
            delete context.f;
            return res;
        }
        Function.prototype.mlcall = mlcall;
    }())

    function fn(num1, num2) {
        console.log(this);
        return num1 + num2
    }
    let obj = { name: "码路" }
    // 1)改变fn中this的指向
    // 2)call可以让函数调用
    // 3)返回函数调用的结果
    // let res = fn.call(obj, 6, 8)
    let res = fn.mlcall(obj, 6, 8)
    console.log(res)
</script>